﻿using MacroprocesosWinForms.Administrador.ControlUsuario;
using MacroprocesosWinForms.Administrador.ControlUsuario.Opciones;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Unimaq.Macroprocesos.LogicaNegocio;

namespace MacroprocesosWinForms.Administrador
{
    public partial class PrincipalAdministrador : Form
    {
        private Unimaq.Macroprocesos.AccesoDatos.Persona userLogin;

        public PrincipalAdministrador()
        {
            InitializeComponent();
        }

        public PrincipalAdministrador(Unimaq.Macroprocesos.AccesoDatos.Persona userLogin) : this()
        {
            // TODO: Complete member initialization
            this.userLogin = userLogin;
        }

        private void PrincipalAdministrador_Load(object sender, EventArgs e)
        {
            this.Text = string.Format("{0} - Bienvenido: {1}", this.Text, userLogin != null ? userLogin.NombreCompleto.Trim() : string.Empty);
            CargarArbolProcesos();
            CargarListaPersonas();
            CargarListaTipoDocumentos();
            //CargarListaOpciones();
        }

        internal void CargarArbolProcesos()
        {
            EmpresaBLL empresaBLL = new EmpresaBLL();
            ProcesoBLL procesoBLL = new ProcesoBLL();

            treeMacroprocesos.Nodes.Clear();
            List<Unimaq.Macroprocesos.AccesoDatos.Empresa> listaEmpresa = empresaBLL.Listar();

            foreach (Unimaq.Macroprocesos.AccesoDatos.Empresa e in listaEmpresa)
            {
                TreeNode nodeEmpresa = new TreeNode() { Text = e.NombreEmpresa, Tag = e , ImageIndex = 0, SelectedImageIndex = 0};

                List<Unimaq.Macroprocesos.AccesoDatos.Proceso> listaProcesos = procesoBLL.Listar(e);

                foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso p in listaProcesos)
                {
                    TreeNode nodeProceso = new TreeNode() { Text = string.Format("[{0}] - {1}", p.CodigoProceso.Trim(), p.Nombre.Trim()), ImageIndex = 1, SelectedImageIndex = 1,Tag = p };
                    nodeEmpresa.Nodes.Add(nodeProceso);
                    CargarProceso(nodeProceso);
                }

                treeMacroprocesos.Nodes.Add(nodeEmpresa);
            }

            treeMacroprocesos.ExpandAll();
        }

        internal void CargarListaPersonas()
        {
            Unimaq.Macroprocesos.LogicaNegocio.PersonaBLL personaBLL = new PersonaBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Persona> listaPersona = personaBLL.Listar();
            List<ListViewItem> viewListPersona = GenerarListView(listaPersona);

            listViewPersonas.Items.Clear();

            foreach (ListViewItem lv in viewListPersona)
            {
                listViewPersonas.Items.Add(lv);
            }
        }

        internal void CargarListaTipoDocumentos()
        {
            Unimaq.Macroprocesos.LogicaNegocio.TipoDocumentoBLL tipoDocumentoBLL = new TipoDocumentoBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.TipoDocumento> listaTipoDocumento = tipoDocumentoBLL.Listar();

            List<ListViewItem> viewListTipoDocumentos = GenerarListView(listaTipoDocumento);

            listViewTipoDocumento.Items.Clear();

            foreach (ListViewItem lv in viewListTipoDocumentos)
            {
                listViewTipoDocumento.Items.Add(lv);
            }
        }

        //internal void CargarListaOpciones()
        //{
        //    Unimaq.Macroprocesos.LogicaNegocio.OpcionBLL opcionBLL = new OpcionBLL();
        //    List<Unimaq.Macroprocesos.AccesoDatos.Opcion> listaOpcion = opcionBLL.Listar();

        //    List<ListViewItem> viewListOpcion = GenerarListView(listaOpcion);

        //    listViewOpciones.Items.Clear();

        //    foreach (ListViewItem lv in viewListOpcion)
        //    {
        //        listViewOpciones.Items.Add(lv);
        //    }
        //}

        private void CargarProceso(TreeNode selectedNodeProceso)
        {
            ProcesoBLL procesoBLL = new ProcesoBLL();
            DocumentoBLL documentoBLL = new DocumentoBLL();
            Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = selectedNodeProceso.Tag != null ? selectedNodeProceso.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso : null;
            
            if (selectedProceso != null)
            {
                List<Unimaq.Macroprocesos.AccesoDatos.Proceso> listaProcesos = procesoBLL.Listar(selectedProceso);
                List<Unimaq.Macroprocesos.AccesoDatos.Documento> listaDocumentos = documentoBLL.Listar(selectedProceso);

                if (listaProcesos.Count > 0)
                {
                    foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso p in listaProcesos)
                    {
                        TreeNode nodeProceso = new TreeNode() { Text = string.Format("[{0}] - {1}", p.CodigoProceso.Trim(), p.Nombre.Trim()), ImageIndex = 1, SelectedImageIndex = 1, Tag = p };
                        selectedNodeProceso.Nodes.Add(nodeProceso);
                        CargarProceso(nodeProceso);
                    }
                }

                if (listaDocumentos.Count > 0)
                {
                    foreach (Unimaq.Macroprocesos.AccesoDatos.Documento d in listaDocumentos)
                    {
                        TreeNode nodeDocumento = new TreeNode() { Text = string.Format("[{0}] - {1}", d.Codigo.Trim(), d.Nombre.Trim()), ImageIndex = 2, SelectedImageIndex = 2,Tag = d };
                        selectedNodeProceso.Nodes.Add(nodeDocumento);
                    }
                }
            }
        }

        private void treeMacroprocesos_AfterSelect(object sender, TreeViewEventArgs e)
        {
            if (e.Node != null)
            {                
                if (e.Node.Tag is Unimaq.Macroprocesos.AccesoDatos.Empresa)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa = e.Node.Tag as Unimaq.Macroprocesos.AccesoDatos.Empresa;

                    Empresa nuevoIUEmpresa = new Empresa(selectedEmpresa);
                    nuevoIUEmpresa.Location = new Point(0, 22);
                    splitContainer1.Panel2.Controls.Clear();
                    splitContainer1.Panel2.Controls.Add(nuevoIUEmpresa);
                }
                else if (e.Node.Tag is Unimaq.Macroprocesos.AccesoDatos.Proceso)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = e.Node.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso;

                    Proceso nuevoIUProceso = new Proceso(selectedProceso);
                    nuevoIUProceso.Location = new Point(0, 22);
                    splitContainer1.Panel2.Controls.Clear();
                    splitContainer1.Panel2.Controls.Add(nuevoIUProceso);
                }
                else if (e.Node.Tag is Unimaq.Macroprocesos.AccesoDatos.Documento)
                {
                    Unimaq.Macroprocesos.AccesoDatos.Documento selectedDocumento = e.Node.Tag as Unimaq.Macroprocesos.AccesoDatos.Documento;

                    Documento nuevoIUDoducmento = new Documento(selectedDocumento);
                    nuevoIUDoducmento.Location = new Point(0, 22);
                    splitContainer1.Panel2.Controls.Clear();
                    splitContainer1.Panel2.Controls.Add(nuevoIUDoducmento);
                }
            }
        }

        private void PrincipalAdministrador_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();
        }

        private List<ListViewItem> GenerarListView(List<Unimaq.Macroprocesos.AccesoDatos.Persona> lista)
        {
            ListViewItem lv;
            List<ListViewItem> result = new List<ListViewItem>();

            foreach (Unimaq.Macroprocesos.AccesoDatos.Persona p in lista)
            {
                lv = new ListViewItem()
                {
                    Text = string.Format("{0} - {1}", p.CodigoRRHH.Trim(), p.NombreCompleto.Trim()),
                    ImageIndex = 4,
                    Tag = p
                };

                result.Add(lv);
            }
            
            return result;
        }

        private List<ListViewItem> GenerarListView(List<Unimaq.Macroprocesos.AccesoDatos.TipoDocumento> lista)
        {
            ListViewItem lv;
            List<ListViewItem> result = new List<ListViewItem>();

            foreach (Unimaq.Macroprocesos.AccesoDatos.TipoDocumento td in lista)
            {
                lv = new ListViewItem()
                {
                    Text = string.Format("{0} - {1}", td.Codigo.Trim(), td.NombreDocumento.Trim()),
                    ImageIndex = 6,
                    Tag = td
                };

                result.Add(lv);
            }

            return result;
        }

        //private List<ListViewItem> GenerarListView(List<Unimaq.Macroprocesos.AccesoDatos.Opcion> lista)
        //{
        //    ListViewItem lv;
        //    List<ListViewItem> result = new List<ListViewItem>();

        //    foreach (Unimaq.Macroprocesos.AccesoDatos.Opcion opc in lista)
        //    {
        //        lv = new ListViewItem()
        //        {
        //            Text = string.Format("{0} - {1}", opc.Codigo.Trim(), opc.Descripcion.Trim()),
        //            ImageIndex = 7,
        //            Tag = opc
        //        };

        //        result.Add(lv);
        //    }

        //    return result;
        //}
        
        private void listViewPersonas_MouseClick(object sender, MouseEventArgs e)
        {
            ListViewHitTestInfo hit = listViewPersonas.HitTest(e.Location);

            if (hit.Item != null)
            {
                ListViewItem lv = hit.Item;

                if (lv.Tag != null)
                {
                    if (lv.Tag is Unimaq.Macroprocesos.AccesoDatos.Persona)
                    {
                        Unimaq.Macroprocesos.AccesoDatos.Persona selPersona =
                            lv.Tag as Unimaq.Macroprocesos.AccesoDatos.Persona;

                        Persona iuPersona = new Persona(selPersona);
                        iuPersona.Location = new Point(0, 22);
                        splitContainer1.Panel2.Controls.Clear();
                        splitContainer1.Panel2.Controls.Add(iuPersona);
                    }
                }
            }
        }

        private void listViewTipoDocumento_MouseClick(object sender, MouseEventArgs e)
        {
            ListViewHitTestInfo hit = listViewTipoDocumento.HitTest(e.Location);

            if (hit.Item != null)
            {
                ListViewItem lv = hit.Item;

                if (lv.Tag != null)
                {
                    if (lv.Tag is Unimaq.Macroprocesos.AccesoDatos.TipoDocumento)
                    {
                        Unimaq.Macroprocesos.AccesoDatos.TipoDocumento selTipoDocumento =
                            lv.Tag as Unimaq.Macroprocesos.AccesoDatos.TipoDocumento;

                        TipoDocumento iuTipoDocumento = new TipoDocumento(selTipoDocumento);
                        iuTipoDocumento.Location = new Point(0, 22);
                        splitContainer1.Panel2.Controls.Clear();
                        splitContainer1.Panel2.Controls.Add(iuTipoDocumento);
                    }
                }
            }
        }

        private void listViewOpciones_MouseClick(object sender, MouseEventArgs e)
        {
            ListViewHitTestInfo hit = listViewOpciones.HitTest(e.Location);

            if (hit.Item != null)
            {
                ListViewItem lv = hit.Item;

                if (lv != null)
                {
                    string nombreOpcion = lv.Text.Trim();

                    switch (nombreOpcion)
                    {
                        case "OPC00001 - Código del Proceso":
                            OPC00001_CodigoProceso opcCodigoProceso = new OPC00001_CodigoProceso();
                            opcCodigoProceso.Location = new Point(0, 22);
                            splitContainer1.Panel2.Controls.Clear();
                            splitContainer1.Panel2.Controls.Add(opcCodigoProceso);
                            break;
                    }
                }
            }
        }

        private void toolStripButtonPersona_Click(object sender, EventArgs e)
        {
            Persona ucPersona = new Persona();
            ucPersona.Location = new Point(0, 21);
            splitContainer1.Panel2.Controls.Clear();
            splitContainer1.Panel2.Controls.Add(ucPersona);

            tabControlMacroprocesos.SelectTab(1);
        }

        private void toolStripButtonTipoDocumento_Click(object sender, EventArgs e)
        {
            TipoDocumento ucTipoDocumento = new TipoDocumento();
            ucTipoDocumento.Location = new Point(0, 21);
            splitContainer1.Panel2.Controls.Clear();
            splitContainer1.Panel2.Controls.Add(ucTipoDocumento);

            tabControlMacroprocesos.SelectTab(2);
        }

        private void toolStripButtonEmpresa_Click(object sender, EventArgs e)
        {
            Empresa ucEmpresa = new Empresa();
            ucEmpresa.Location = new Point(0, 22);
            splitContainer1.Panel2.Controls.Clear();
            splitContainer1.Panel2.Controls.Add(ucEmpresa);

            tabControlMacroprocesos.SelectTab(0);
        }

        private void toolStripButtonProceso_Click(object sender, EventArgs e)
        {
            Proceso ucProceso = new Proceso();
            ucProceso.Location = new Point(0, 22);
            splitContainer1.Panel2.Controls.Clear();
            splitContainer1.Panel2.Controls.Add(ucProceso);

            tabControlMacroprocesos.SelectTab(0);
        }

        private void toolStripButtonDocumento_Click(object sender, EventArgs e)
        {
            Documento ucDocumento = new Documento();
            ucDocumento.Location = new Point(0, 21);
            splitContainer1.Panel2.Controls.Clear();
            splitContainer1.Panel2.Controls.Add(ucDocumento);

            tabControlMacroprocesos.SelectTab(0);
        }

        private void toolStripButtonCerrarSesion_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("¿Confirma cierre de sesión?", "Macroprocesos", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1);

            if (dr == DialogResult.Yes)
            {
                Form1 iuUsuario = new Form1();
                this.Hide();
                iuUsuario.Show(this);
            }
        }
    }
}
